package com.wn.login.repository

import androidx.lifecycle.LiveData
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.ToastUtils
import com.wn.common.model.SingleLiveData
import com.wn.common.net.config.SP_KEY_USER_TOKEN
import com.wn.common.net.support.serverData
import com.wn.common.utils.CnSpUtils
import com.wn.login.repository.api.LoginService
import com.wn.login.repository.data.LoginReq
import com.wn.login.repository.data.RegisterRsp
import com.wn.service.db.UserDao
import com.wn.service.db.UserInfo
import com.wn.service.net.*
import dagger.hilt.android.scopes.ViewModelScoped
import javax.inject.Inject

/**
 * @Author: wn
 * @Date: 2023/3/31 17:11
 * @Description: 登录模块相关的 APi 仓库  类实现
 * 修改   构造函数中 包含  api  与  dao
 */

@ViewModelScoped
class LoginRepository @Inject constructor(
  private val service: LoginService,
  private val userDao: UserDao,
) : ILoginRepository {

  // 数据倒灌
//  private val _registerRsp = SingleLiveData<RegisterRsp>()
//  private val _loginRsp = SingleLiveData<UserInfo>()

  /**
   * 手机号是否注册过
   */
  private val _registerRsp = SingleLiveData<RegisterRsp>()
  override val registerRsp: LiveData<RegisterRsp> = _registerRsp

  /**
   * 登陆请求
   */
//  override val loginRsp: LiveData<UserInfo> = _loginRsp

  /**
   * 校验手机号是否注册、合法
   * @param account String -- 手机号
   */
  override suspend fun checkRegister(account: String) {
    service.isRegister(account)
      .serverData()
      .onSuccess<BaseResponse<RegisterRsp>> {
        onBizOK { _, data, _ ->
          _registerRsp.value = data
//          LogUtils.w("检测账号返回成功 code:$code, msg:$msg data:$data")
          return@onBizOK
        }
        onBizError { code, message ->
          ToastUtils.showShort("网络异常")
          LogUtils.w("是否注册 BizError $code, $message")
        }
      }
      .onFailure {
        ToastUtils.showShort("网络异常")
        LogUtils.e("是否注册 接口异常 $message")
      }
  }

  /**
   * 手机号合法的基础上，调用登录，获取登录结果token
   * @param body LoginReq -- 登录模块相关的请求 数据类
   */
  override suspend fun requestLogin(body: LoginReq): Result<BaseResponse<UserInfo>> =
    kotlin.runCatching {
      service.login(body)
    }

  /**
   * 添加用户
   * @param userInfo 多个同类型参数
   */
  override suspend fun insertUser(vararg userInfo: UserInfo) {
    // 保存 token
    CnSpUtils.put(SP_KEY_USER_TOKEN, userInfo[0].token)
    // 保存数据库  
    userDao.insertUser(*userInfo)
  }


}